module utils.respdata;

import vibe.data.json : serializeToJsonString;
import std.json : JSONValue, parseJSON;

/** 
 * 封装响应数据类
 */
class RespData
{

    /** 
     * 构造响应数据
     * Params:
     *   code   uint    自定义响应码
     * Returns: JSONValue
     */
    public static JSONValue newData(uint code)
    {
        JSONValue respData;
        respData.object = null;
        respData.object["code"] = JSONValue(code);
        respData.object["msg"] = JSONValue("");
        respData.object["data"] = JSONValue(null);

        return respData;
    }

    /** 
     * 构造响应数据
     * Params:
     *   code   uint    自定义响应码
     *   msg   string    自定义响应信息
     * Returns: JSONValue
     */
    public static JSONValue newData(uint code, string msg)
    {
        JSONValue respData;
        respData.object = null;
        respData.object["code"] = JSONValue(code);
        respData.object["msg"] = JSONValue(msg);
        respData.object["data"] = JSONValue(null);

        return respData;
    }

    /** 
     * 构造响应数据
     * Params:
     *   code   uint    自定义响应码
     *   msg   string    自定义响应信息
     *   data   T    自定义响应数据
     * Returns: JSONValue
     */
    public static JSONValue newData(T)(uint code, string msg, T data)
    {
        JSONValue respData;
        respData.object = null;
        respData.object["code"] = JSONValue(code);
        respData.object["msg"] = JSONValue(msg);
        respData.object["data"] = parseJSON(serializeToJsonString(data));

        return respData;
    }

    /** 
     * 构造响应数据
     * Params:
     *   code   uint    自定义响应码
     *   msg   string    自定义响应信息
     *   data   string   string型json格式数据
     * Returns: JSONValue
     */
    public static JSONValue newData(uint code, string msg, string jsonData)
    {
        JSONValue respData;
        respData.object = null;
        respData.object["code"] = JSONValue(code);
        respData.object["msg"] = JSONValue(msg);
        respData.object["data"] = parseJSON(jsonData);

        return respData;
    }

    /** 
     * 构造响应数据
     * Params:
     *   code   uint    自定义响应码
     *   msg   string    自定义响应信息
     *   data   JSONValue   JSONValue格式数据
     * Returns: JSONValue
     */
    public static JSONValue newData(uint code, string msg, JSONValue data)
    {
        JSONValue respData;
        respData.object = null;
        respData.object["code"] = JSONValue(code);
        respData.object["msg"] = JSONValue(msg);
        respData.object["data"] = data;

        return respData;
    }
}
